//
// Created by pengtg on 2020/2/23.
//

#ifndef ANDROIDVIDEOPLAYER_IDECODE_H
#define ANDROIDVIDEOPLAYER_IDECODE_H

#include "XParameter.h"
#include "IObserver.h"
#include <list>

//解码接口，支持硬解码
class IDecode:public IObserver
{
public:
    //打开解码器
    virtual bool Open(XParameter para,bool isHard= false) = 0;
    virtual void Close() = 0;
    virtual void Clear();
    //future模型 发送数据到线程解码
    virtual bool SendPacket(XData pkt) = 0;

    //从线程中获取解码结果，再次调用会复用上次空间，线程不安全
    //数据取出来之后只能在当前线程中使用，不能在另外一个线程中使用。
    //想要线程安全：加锁会产生非常大的开销，只能用复制。
    virtual XData RecvFrame() = 0;

    //由主体notify的数据 阻塞
    virtual void Update(XData pkt);

    //标记当前解码器是音频解码器还是视频解码器
    bool isAudio = false;

    //最大的队列缓冲
    int maxList = 100;

    //同步时间，再次打开文件要清理
    int synPts = 0;
    //表示当前播放到的位置
    int pts = 0;

protected:
    virtual void Main();
    //读取缓冲
    std::list<XData> packs;
    std::mutex packsMutex;
};


#endif //ANDROIDVIDEOPLAYER_IDECODE_H
